package com.vitogiovanni.tobook;

import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Comparator;
import java.util.Date;
import java.util.List;

import android.app.AlertDialog;
import android.app.ListFragment;
import android.app.ProgressDialog;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.os.AsyncTask;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ListView;
import android.widget.Toast;

import com.google.api.client.extensions.android.http.AndroidHttp;
import com.google.api.client.json.jackson2.JacksonFactory;
import com.vitogiovanni.tobook.entity.prenotazioneendpoint.Prenotazioneendpoint;
import com.vitogiovanni.tobook.entity.prenotazioneendpoint.model.Locale;
import com.vitogiovanni.tobook.entity.prenotazioneendpoint.model.Prenotazione;
import com.vitogiovanni.tobook.utilities.AnnullaPrenotazioneTaskCompleteListener;
import com.vitogiovanni.tobook.utilities.NetworkChecker;
import com.vitogiovanni.tobook.utilities.PrenotazioneItem;
import com.vitogiovanni.tobook.utilities.PrenotazioniListViewAdapter;
import com.vitogiovanni.tobook.utilities.UserEmailFetcher;

public class ListaPrenotazioniFragment extends ListFragment implements AnnullaPrenotazioneTaskCompleteListener<String> {
	
	private PrenotazioniListViewAdapter adapter;
	
	private static String successoAnnullamento = "Prenotazione annullata con successo";
	
	private static final String ARG_SECTION_NUMBER = "section_number";
	private ListView listView;
	private List<PrenotazioneItem> prenotazioni = new ArrayList<PrenotazioneItem>();
	private View rootView;
	private AnnullaPrenotazioneTask annullaTask;
	private ProgressDialog progressAnnullaPrenotazione;
	private AnnullaPrenotazioneTaskCompleteListener<String> annPrenListener;
	
	public static ListaPrenotazioniFragment newInstance(int sectionNumber) {
		ListaPrenotazioniFragment fragment = new ListaPrenotazioniFragment();
		Bundle args = new Bundle();
		args.putInt(ARG_SECTION_NUMBER, sectionNumber);
		fragment.setArguments(args);
		return fragment;
	}
	
	public ListaPrenotazioniFragment() {
		
	}
	
	@Override
	public View onCreateView(LayoutInflater inflater, ViewGroup container,
			Bundle savedInstanceState) {
		rootView = inflater.inflate(R.layout.fragment_lista_prenotazioni,
				container, false);
		
		listView = (ListView) rootView.findViewById(android.R.id.list);
        adapter = new PrenotazioniListViewAdapter(getActivity().getApplicationContext(),R.layout.list_item_prenotazione, prenotazioni);
        listView.setAdapter(adapter);
		annPrenListener = this;
		return rootView;
	}
	
	public void updateListaPrenotazioni(List<Prenotazione> listPrenotazioni){
		
		for(Prenotazione pren: listPrenotazioni)
		{
			Locale locale = pren.getLocalePrenotato();
			pren.getOrario();
			PrenotazioneItem item = new PrenotazioneItem(pren.getId().toString(), locale.getNome(),locale.getCitta(),
					locale.getVia(), pren.getNominativo(), pren.getNumeroPosti(), new Date(pren.getOrario().getValue()-7200000), 
					pren.getDurata(), locale.getId().toString());
			prenotazioni.add(item);
			adapter.sort(new Comparator<PrenotazioneItem>(){
				public int compare(PrenotazioneItem arg0, PrenotazioneItem arg1){
					return arg1.getData().compareTo(arg0.getData());
				}
			});
		}
	}
	
	@Override
	public void onListItemClick(ListView l, View v, int position, long id) {
		super.onListItemClick(l, v, position, id);
		final PrenotazioneItem prenotazione = adapter.getItem(position);
		
		String nomeLocale = prenotazione.getNomeLocale();
		String citta = prenotazione.getCitta();
		String via = prenotazione.getVia();
		String nominativo = prenotazione.getNominativo();
		String numeroPosti = Integer.toString(prenotazione.getNumeroPosti());
		Date dataOra = prenotazione.getData();
		long durata = prenotazione.getDurata();
		
		SimpleDateFormat formatData = new SimpleDateFormat("dd-MM-yyyy");
		SimpleDateFormat formatOrario = new SimpleDateFormat("HH:mm");
		String data = formatData.format(dataOra);
		String orario = formatOrario.format(dataOra) +" - " + formatOrario.format(new Date(dataOra.getTime()+durata));
		
		AlertDialog dialog;
		AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
		builder.setTitle(nomeLocale)
				.setMessage(getText(R.string.citta) + ": " + citta + "\n" + 
				getText(R.string.via) + ": " + via + "\n" + 
				getText(R.string.data) + ": " + data + "\n" + 
				getText(R.string.orario) + ": " + orario + "\n" +
				getText(R.string.postiPrenotati) + ": " + numeroPosti + "\n" +
				getText(R.string.nominativoPrenotazione) + ": " + nominativo
				 )
				 .setPositiveButton(R.string.locale, new DialogInterface.OnClickListener() {
					@Override
					public void onClick(DialogInterface dialog, int which) {
						if (!NetworkChecker.isInternetAvailable(getActivity())) {
							NetworkChecker.noConnectionToast(getActivity());
							return;
						}
						Intent intentLocale = new Intent(getActivity(), LocaleActivity.class);
						
						String idLocale = prenotazione.getIdLocaleString();
						
						intentLocale.putExtra("idLocale", idLocale);
						intentLocale.putExtra("nomeLocale", prenotazione.getNomeLocale());
						startActivity(intentLocale);
					}
				})
				.setNegativeButton(R.string.prenotazioni, new DialogInterface.OnClickListener() {
					@Override
					public void onClick(DialogInterface dialog, int which) {
						dialog.dismiss();
					}
				});
		
		if(dataOra.compareTo(new Date())>0)
		{
			builder.setNeutralButton(R.string.annulla_prenotazione, new DialogInterface.OnClickListener() {
				AlertDialog dialogConferma;
				@Override
				public void onClick(DialogInterface dialog, int which) {
					AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
					builder.setMessage(getText(R.string.conferma_annulla_prenotazione))
					.setPositiveButton(R.string.si, new DialogInterface.OnClickListener() {
						
						@Override
						public void onClick(DialogInterface dialog, int which) {
							if (!NetworkChecker.isInternetAvailable(getActivity())) {
								NetworkChecker.noConnectionToast(getActivity());
								return;
							}
							Context context = getActivity().getApplicationContext();
							String email = UserEmailFetcher.getEmail(context);
							annullaTask = (AnnullaPrenotazioneTask) new AnnullaPrenotazioneTask(getActivity().getApplicationContext(), annPrenListener );
							annullaTask.execute(prenotazione.getId(), email);		
						}
					})
					.setNegativeButton(R.string.no, new DialogInterface.OnClickListener() {
						
						@Override
						public void onClick(DialogInterface dialog, int which) {
							dialogConferma.dismiss();
						}
					});
					dialogConferma = builder.create();
					dialogConferma.show();
					
					
				}
			});
		}
				
		dialog = builder.create();
		dialog.show();
	}
	
	@Override
	public void annullaPrenotazioneTaskComplete(String result) {
		if(progressAnnullaPrenotazione != null)
		{
			progressAnnullaPrenotazione.dismiss();
		}
		if(successoAnnullamento.equals(result))
		{	
			Context context = getActivity().getApplicationContext();
			Toast toast = Toast.makeText(context, result, Toast.LENGTH_SHORT);
			toast.show();
			CharSequence text = UserEmailFetcher.getEmail(context);
			Intent intent = new Intent(getActivity(), ListaPrenotazioniActivity.class);
			intent.putExtra(MainActivity.EMAIL_UTENTE, text.toString());
			startActivity(intent);
		}
		else{	
			Context context = getActivity().getApplicationContext();
			Toast toast = Toast.makeText(context, result, Toast.LENGTH_SHORT);
			toast.show();
		}
		
	}
	
	private class AnnullaPrenotazioneTask extends AsyncTask<String, Void, String>
	{
		private AnnullaPrenotazioneTaskCompleteListener<String> callback;
		
		public AnnullaPrenotazioneTask(Context context, AnnullaPrenotazioneTaskCompleteListener<String> cb)
		{
			this.callback = cb;
		}
		
		@Override
		protected String doInBackground(String... arg0) {
			
			Prenotazioneendpoint.Builder builder1 = new Prenotazioneendpoint.Builder(
					AndroidHttp.newCompatibleTransport(), new JacksonFactory(),
					null);
			builder1 = CloudEndpointUtils.updateBuilder(builder1);
			builder1.setApplicationName("to-book");
			Prenotazioneendpoint prenotazioneEndpoint = builder1.build();
			try{
				prenotazioneEndpoint.annullaPrenotazione(arg0[0], arg0[1]).execute();
			}catch(IOException e){

				return getMsgFromJson(e.getMessage());
			}
			return successoAnnullamento;
		}	
		
		@Override
		protected void onPostExecute(String result) {
			if (progressAnnullaPrenotazione != null) 
			{
				progressAnnullaPrenotazione.dismiss();
			}
			callback.annullaPrenotazioneTaskComplete(result);
		}
		
		private String getMsgFromJson(String json)
		{
			int messagePosition = json.indexOf("\"message\""); 
			String message;
			message = json.substring(messagePosition+13, json.indexOf("\"", messagePosition+13));
			
			return message;
		}
		
	}

	
}


